//路由鉴权，限制路由在什么情况下才能被访问
import router from '@/router/index'
//进度条
import npr from 'nprogress'
import 'nprogress/nprogress.css'
//导入大仓库小仓库用来判断token是否存在用户是否登录
import pinia from './store/index'
import useUserStore from './store/module/user'
//导入设置
import setting from './setting'
import { ElMessage } from 'element-plus'
let userStore = useUserStore(pinia)
//全局守卫：任意路由切换都会触发的钩子
//全局前置守卫
router.beforeEach(async (to: any, from: any, next: any) => {
  document.title = `${setting.title}- ${to.meta.title}`
  npr.start()
  let token = userStore.token
  let username = userStore.username
  //保留用于测试
  // console.log(1, token ? true : false, 2, to.path)
  if (token) {
    //登录成功后除了不可以访问login其他都可以访问
    if (to.path == '/login') {
      next({ path: '/' })
    } else {
      //访问其他组件时因为离开了home组件就会销毁，销毁以后再次切换路由刷新页面数据就会丢失
      //所以在切换路由刷新的时候就判断用户信息是否存在，不存在就调用方法重新加载
      if (username) {
        next()
      } else {
        try {
          //用户信息获取成功
          await userStore.userInfoAction()
          //这时候对于动态路由来说可能数据获取到了但是，异步路由还没有加载完毕，会出现空白效果
          next({ ...to })
          //next({...to})就相当于去找要去的路由没找到重新执行一次beforeach()去找路由，一直到找到为止
          //添加replacetrue就是不希望用户可以在找路由的时候回退出现问题{ ...to, replace: true }
        } catch (error) {
          ElMessage({ type: 'warning', message: '登录信息过期' })
          //获取信息失败1.token过期2.用户手动修改
          //清空用户信息，跳转到login
          //不加await后面代码不执行
          await userStore.userLogOut()
          next({ path: '/login', query: { redirect: to.path } })
        }
      }
    }
  } else {
    if (to.path == '/login') {
      next()
    } else {
      next({ path: '/login', query: { redirect: to.path } })
    }
  }
})
//全局后置守卫

router.afterEach(() => {
  npr.done()
})
